{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "list comprehension\n",
    "\n",
    "列表推导式（list comprehension）来创建一个列表，然后再将这个列表转换为NumPy数组。下面我会用一个简单的例子来解释这个语法。\n",
    "\n",
    "假设我们有一个包含多个点的列表，每个点都是一个对象，具有`x`和`y`两个属性，分别代表点在二维空间中的坐标。我们想要将这些点的坐标提取出来，并存储在一个NumPy数组中。\n",
    "\n",
    "首先，我们创建一个点的类来模拟`faceShape.parts()`返回的对象：\n",
    "\n",
    "然后，我们创建一个包含这些点的列表：\n",
    "\n",
    "现在，我们可以使用与原始代码类似的列表推导式来提取这些点的坐标：\n",
    "\n",
    "在这个列表推导式中：\n",
    "\n",
    "* `for p in points` 部分表示我们要遍历`points`列表中的每个元素（这里是`Point`对象），并将每个元素临时命名为`p`。\n",
    "* `[p.x, p.y]` 部分表示对于每个`p`，我们都要提取其`x`和`y`属性，并将它们作为一个列表返回。\n",
    "\n",
    "最后，我们可以将这个列表转换为NumPy数组：\n",
    "\n",
    "在这个例子中，`np.array(coordinates)`将我们之前创建的坐标列表转换为了一个NumPy数组。这个数组可以方便地进行各种数学运算和数据处理。\n",
    "\n",
    "现在，回到原始的代码 `face.landmarks = np.array([[p.x, p.y] for p in faceShape.parts()])`，你可以看到它与我们上面的例子非常相似。它只是在一个更复杂的应用场景（人脸关键点检测）中使用了相同的列表推导式和NumPy数组转换技术。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "result_list_after_transform = [\n",
    "    # 这里实际上可以是一个Function\n",
    "    some_transformation(item) for item in some_list\n",
    "]"
   ]
  }
 ],
 "metadata": {
  "language_info": {
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
